package administracion.managedBeans.pedidos;

import Entities.Chofer;
import Entities.Cliente;
import Entities.Externo;
import Entities.ItemProducto;
import ejb.ChoferFacadeLocal;
import ejb.ClienteFacadeLocal;
import ejb.Condicional;
import ejb.ConsultaUniversalFacadeLocal;
import ejb.ExternoFacadeLocal;
import ejb.soportes.Consulta;
import exceptions.FechaInvalidaPedidoException_1;
import exceptions.ListaProductosPedidoVacia;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import sesion.PermisoPagina;
import tablemodel.GeneralLazyModel;
import util.PageCodeGenerico;

@ManagedBean
@ViewScoped
public class PCPedidoExt extends PageCodeGenerico implements Serializable {

    @EJB
    private ChoferFacadeLocal choferFacade;
    @EJB
    private ClienteFacadeLocal clienteFacade;
    @EJB
    private ExternoFacadeLocal entidadFacade;
    @EJB
    private ConsultaUniversalFacadeLocal consultaUniversalFacade;
    private LazyDataModel<Externo> listado;
    private Externo temporal;
    private Properties colsVisible;
    private Map<String, String> checksVisible;
    private List<String> selectedChecksVisible;
    private Accion accion = Accion.CREAR;
    private final Double iva = 0.22;
    private Double total;
    private Double subTotal;
    private Double precioIva;
    private String demora;
    private String direccionAd;
    private Calendar horaEnvio;
    private Cliente cliGenerico;
    private String nombreUsuario;
    private List<SelectItem> listaChoferes;
    private Integer choferId;
    @ManagedProperty("#{pCPedido}")
    private PCPedido pedidoGenerico;
    private Date fechaHoy;
    private Date minFecha;
    private Date maxFecha;
    private String dir;

    public Integer getChoferId() {
        return choferId;
    }

    public void setChoferId(Integer choferId) {
        this.choferId = choferId;
    }

    public PCPedido getPedidoGenerico() {
        return pedidoGenerico;
    }

    public void setPedidoGenerico(PCPedido pedidoGenerico) {
        this.pedidoGenerico = pedidoGenerico;
    }

    public Date getFechaHoy() {
        return fechaHoy;
    }

    public void setFechaHoy(Date fechaHoy) {
        this.fechaHoy = fechaHoy;
    }

    public Date getMinFecha() {
        return minFecha;
    }

    public void setMinFecha(Date minFecha) {
        this.minFecha = minFecha;
    }

    public Date getMaxFecha() {
        return maxFecha;
    }

    public void setMaxFecha(Date maxFecha) {
        this.maxFecha = maxFecha;
    }

    public String getDir() {
        return dir;
    }

    public void setDir(String dir) {
        this.dir = dir;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    /**
     *
     * Creates a new instance of ExternoBean
     */
    public PCPedidoExt() {
        super();
        this.listado = new GeneralLazyModel<>(new Externo());
        this.temporal = new Externo();
        this.colsVisible = new Properties();
        this.total = new Double(0);
        this.subTotal = new Double(0);
        this.precioIva = new Double(0);
        this.colsVisible = new Properties();
        this.direccionAd = "";
        this.dir = "";
        this.nombreUsuario = "";
        this.fechaHoy = new Date();
        int diferenciaEnDias = 2;
        Date fechaActual = Calendar.getInstance().getTime();
        fechaActual.setHours(22);
        fechaActual.setMinutes(59);
        long tiempoActual = fechaActual.getTime();
        long unDia = (diferenciaEnDias * 24 * 60 * 60 * 1000);
        this.minFecha = this.fechaHoy;
        this.maxFecha = new Date(tiempoActual + unDia);
        this.listaChoferes = new ArrayList<>();
    }

    /**
     * Funcion que recibe item de la lista y establece si es editable
     *
     * @param item
     * @return
     */
    public Boolean esEditable(Externo item) {
        Boolean resu;
        if (item.getFacturado() == true) {
            resu = false;
        } else {
            resu = true;
        }
        return resu;

    }

    /**
     *
     * Obtiene la lista de choferes.
     *
     * @return lista de SelectItem
     */
    public List<SelectItem> getListaChoferes() {
        if (listaChoferes.isEmpty()) {
            try {
                if (!choferFacade.listarTodo().isEmpty()) {
                    for (Chofer c : choferFacade.listarTodo()) {
                        SelectItem i = new SelectItem();
                        i.setValue(c.getId());
                        i.setLabel(c.getNombre() + " " + c.getApellido());
                        i.setDescription(c.getNombre() + " " + c.getApellido());
                        this.listaChoferes.add(i);
                    }
                }
            } catch (Exception ex) {
                Logger.getLogger(PCPedidoExt.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return listaChoferes;
    }

    public void setListaChoferes(List<SelectItem> listaChoferes) {
        this.listaChoferes = listaChoferes;
    }

    public ClienteFacadeLocal getClienteFacade() {
        return clienteFacade;
    }

    public void setClienteFacade(ClienteFacadeLocal clienteFacade) {
        this.clienteFacade = clienteFacade;
    }

    public ChoferFacadeLocal getChoferFacade() {
        return choferFacade;
    }

    public void setChoferFacade(ChoferFacadeLocal choferFacade) {
        this.choferFacade = choferFacade;
    }

    public Cliente getCliGenerico() {
        return cliGenerico;
    }

    public void setCliGenerico(Cliente cliGenerico) {
        this.cliGenerico = cliGenerico;
    }

    public String getDireccionAd() {
        return direccionAd;
    }

    public void setDireccionAd(String direccionAd) {
        this.direccionAd = direccionAd;
    }

    public Calendar getHoraEnvio() {
        return horaEnvio;
    }

    public void setHoraEnvio(Calendar horaEnvio) {
        this.horaEnvio = horaEnvio;
    }

    public String getDemora() {
        return demora;
    }

    public void setDemora(String demora) {
        this.demora = demora;
    }

    public String devolverTituloDlg() {
        switch (this.accion) {
            case CREAR:
                return "Crear";
            case EDITAR:
                return "Editar";
            default:
                return "";
        }
    }

    /**
     * Devuelve los permisos de la pagina.
     *
     * @return
     */
    public PermisoPagina consultarPermisos() {
        if (getMi_sesion() != null) {
            return getMi_sesion().consultarPermisos(Externo.class);
        } else {
            return new PermisoPagina();
        }
    }

    public String devolverTxtBtnCancelarDlg() {
        switch (this.accion) {
            case VER:
                return "Cerrar";
            default:
                return "Cancelar";
        }
    }

    public String getIdFormData() {
        return ":tabs:formdataexterno:pedido  :tabs:formdataexterno:costo_pedido";
    }

    public String getIdFormTable() {
        return ":tabs:formTablaexterno:tableModelexterno growldataexterno";
    }

    public String getCierraDialogo() {
        switch (accion) {
            case CREAR:
                return "pedido";
            default:
                return "";
        }
    }

    public void setearCliente() {
        temporal = temporal == null ? new Externo() : temporal;
        this.accion = Accion.CREAR;
        if (this.getMi_sesion().getUsuario() instanceof Cliente) {
            this.temporal.setCliente((Cliente) this.getMi_sesion().getUsuario());
            System.out.println("");
            if (!this.temporal.getCliente().getDetalle().trim().equals("")) {
                this.setDireccionAd(this.temporal.getCliente().getCalle() + " "
                        + this.temporal.getCliente().getNumero() + ", "
                        + this.temporal.getCliente().getDetalle());
            } else {
                this.setDireccionAd(this.temporal.getCliente().getCalle() + " "
                        + this.temporal.getCliente().getNumero());
            }
        }
    }

    public void setearClienteGenerico() {
        try {
            temporal = temporal == null ? new Externo() : temporal;
            this.accion = Accion.CREAR;
            if (this.getMi_sesion().getUsuario() instanceof Cliente) {
                this.temporal.setCliente((Cliente) this.getMi_sesion().getUsuario());
            }
        } catch (Exception ex) {
            Logger.getLogger(PCPedidoExt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String devolverTxtLimpiarFormDlg() {
        switch (this.accion) {
            case EDITAR:
                return "Restablecer formulario";
            default:
                return "Limpiar formulario";
        }
    }

    public boolean esCrear() {
        return this.accion == Accion.CREAR;
    }

    public boolean esEditar() {
        return this.accion == Accion.EDITAR;
    }

    public boolean esVer() {
        return this.accion == Accion.VER;
    }

    /**
     * Función que reinicializa los check de las columnas seleccionables de la
     * tabla.
     */
    @PostConstruct
    public void reinicializarChecks() {
        this.checksVisible = new HashMap<>();
        this.checksVisible.put("Id", "codigo");
        this.checksVisible.put("Fecha pedido", "fechaHora");
        this.checksVisible.put("Fecha envío", "fechaHoraEnvio");
        this.checksVisible.put("Direccion", "direccion");
        this.checksVisible.put("Cliente", "nombreCliente");
        this.checksVisible.put("Chofer", "nombreChofer");

        this.selectedChecksVisible = new ArrayList<>();
        this.selectedChecksVisible.add("codigo");
        this.selectedChecksVisible.add("fechaHora");
        this.selectedChecksVisible.add("fechaHoraEnvio");
        this.selectedChecksVisible.add("direccion");
        this.selectedChecksVisible.add("nombreCliente");
        this.selectedChecksVisible.add("nombreChofer");
    }

    /**
     * Clase que setea las columnas visibles.
     */
    public void setearVisibles() {
        for (Map.Entry<String, String> entry : checksVisible.entrySet()) {
            String valor = entry.getValue();
            boolean existe = false;
            for (Iterator<String> it = selectedChecksVisible.iterator(); it.hasNext();) {
                String colSel = it.next();
                if (colSel.trim().toLowerCase().equals(valor.trim().toLowerCase())) {
                    existe = true;
                    break;
                }
            }
            this.colsVisible.put(valor, existe);
        }
    }

    public LazyDataModel<Externo> getListado() {
        if (consultarPermisos().isVer()) {
            return listado;
        } else {
            return null;
        }
    }

    public void setListado(LazyDataModel<Externo> listado) {
        this.listado = listado;
    }

    public Externo getTemporal() {
        return temporal;
    }

    public void setTemporal(Externo temporal) {
        this.temporal = temporal;
    }

    public Map<String, String> getChecksVisible() {
        return checksVisible;
    }

    public void setChecksVisible(Map<String, String> checksVisible) {
        this.checksVisible = checksVisible;
    }

    public List<String> getSelectedChecksVisible() {
        return selectedChecksVisible;
    }

    public void setSelectedChecksVisible(List<String> selectedChecksVisible) {
        this.selectedChecksVisible = selectedChecksVisible;
    }

    public void reinicializarTemporal() {
        this.nombreUsuario = "";
        this.direccionAd = "";
        this.dir = "";
        this.temporal = new Externo();
        this.accion = Accion.CREAR;
        this.getPedidoGenerico().setPedido(null);
        this.total = new Double(0);
        this.subTotal = new Double(0);
        this.precioIva = new Double(0);
        this.pedidoGenerico.setGetIdFormTabla(this.getIdFormTable());
        this.pedidoGenerico.setIdInternoData(this.getIdFormData());
    }

    /**
     * Establece el objeto temporal para trabajar. Dependiendo de si estamos en
     * editar o crear
     *
     * @param objeto
     * @param isEditar
     */
    public void establecerTemporal(Externo objeto, boolean isEditar) {
        this.nombreUsuario = "";
        this.direccionAd = "";
        this.dir = "";
        this.temporal = (objeto == null) ? new Externo() : objeto;
        this.accion = (isEditar) ? Accion.EDITAR : Accion.VER;
        if (temporal != null) {
            this.getPedidoGenerico().setPedido(this.temporal.getListaItemsProductos());
        }
    }

    public String getIdFormTablaFactu() {
        return ":tabs:formTablaexterno:tableModelexterno growldata2externo";
    }

    /**
     * Establece el objeto temporal para trabajar. Dependiendo de si estamos en
     * editar o crear. Se utiliza para los pedidos externos dentro del modulo
     * administración
     *
     * @param objeto
     * @param isEditar
     */
    public void establecerTemporalGenerico(Externo objeto, boolean isEditar) {
        this.nombreUsuario = "";
        this.direccionAd = "";
        this.dir = "";
        this.pedidoGenerico.setGetIdFormTabla(this.getIdFormTable());
        this.pedidoGenerico.setIdInternoData(this.getIdFormData());
        try {
            // Cambiar por el generico que creemos en base
            this.cliGenerico = clienteFacade.buscarPorId(7);
            if (objeto == null) {
                this.temporal = new Externo();
            } else {
                this.temporal = objeto;
                this.pedidoGenerico.setPedido(this.temporal.getListaItemsProductos());
                if (temporal.getChofer() != null) {
                    this.choferId = temporal.getChofer().getId();
                } else {
                    this.choferId = null;
                }
                this.nombreUsuario = this.temporal.getCliente().getNombreUsuario();
                this.direccionAd = this.temporal.getDireccion();
            }
            this.accion = (isEditar) ? Accion.EDITAR : Accion.VER;
        } catch (Exception ex) {
            Logger.getLogger(PCPedidoExt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void reinicializarColsVisible() {
        this.colsVisible.clear();
    }

    /**
     *
     * @param col Sin tildes ni espacios y en minúsculas
     * @param visible
     */
    public void establecerColVisible(String col, boolean visible) {
        this.colsVisible.put(col, visible);
    }

    /**
     *
     * @param col Sin tildes ni espacios y en minúsculas
     * @return
     */
    public boolean getColVisible(String col) {
        boolean resp = true;
        if (this.colsVisible.get(col) != null) {
            try {
                resp = (boolean) this.colsVisible.get(col);
            } catch (Exception e) {
            }
        }
        return resp;
    }

    /**
     * Asigna chofer apedido externo.
     */
    public void asignarChofer() {
        if (consultarPermisos().isModificacion()) {
            if (this.temporal != null) {
                try {
                    Chofer c = choferFacade.buscarPorId(this.getChoferId());
                    this.temporal.setChofer(c);
                    entidadFacade.editar(this.temporal);
                    setearInfo("Se ha asignado el chofer correctamente.");
//                    Mail mail = new Mail();
//                    if (this.temporal != null && this.temporal.getCliente() != null) {
//                        List<ItemProducto> items = this.temporal.getListaItemsProductos();
//                        String detalle = "";
//                        if (items != null) {
//                            detalle += "</br><table>";
//                            for (Iterator<ItemProducto> it = items.iterator(); it.hasNext();) {
//                                ItemProducto ip = it.next();
//                                if (ip != null && ip.getCantidad() > 0) {
//                                    detalle += "<tr><td>" + ip.getCantidad() + "</td><td>" + ip.getProducto().getDescripcionCorta() + "</td></tr>";
//                                }
//                            }
//                            detalle += "</table>";
//                        }
//                        mail.enviar(this.temporal.getCliente().getEmail(),
//                                "Su pedido está en camino!",
//                                "Estimado cliente:</br>Le informamos que su pedido ya está en camino.</br>¡Llegará en cualquier momento!</br>Deliccio" + detalle);
//                    }
                } catch (Exception e) {
                    setearError(e);
                }
            } else {
                setearInfo("No hay chofer para asignar.");
            }
        } else {
            setearError("No tiene permisos suficientes para ejecutar esta acción");
        }
    }

    public void eliminar() {
        if (consultarPermisos().isBaja()) {
            if (this.temporal != null) {
                try {
                    entidadFacade.eliminar(this.temporal);
                    setearInfo("Operación finalizada correctamente.");
                } catch (Exception e) {
                    setearError(e);
                }
            } else {
                setearInfo("Nada que eliminar.");
            }
        } else {
            setearError("No tiene permisos suficientes para ejecutar esta acción");
        }
    }

    /**
     * Funcion que dado un pedido establece la factura para que se pueda ver.
     *
     * @param objeto
     */
    public void imprimirFactura(Externo objeto) {
            this.establecerTemporal(objeto, true);
            this.total = new Double(0);
            this.subTotal = new Double(0);
            this.precioIva = new Double(0);
            for (ItemProducto it : this.temporal.getListaItemsProductos()) {
                Double precio = it.getCantidad() * it.getPrecioVigente();
                total = total + precio;
            }

            Double totalextra = total;
            precioIva = (totalextra * 1.22) - totalextra;
            subTotal = total - precioIva;
        
    }

    /**
     * Funcion que establece la factura en estado facturado la impresionde la
     * misma.
     *
     * @param mi_param
     * @return
     */
    public boolean facturar(String mi_param) {
        if (consultarPermisos().isFacturar()) {
            try {
                String codigo = String.valueOf(this.temporal.getId());
                this.temporal.setFacturado(true);
                entidadFacade.editar(this.temporal);
                setearInfo("Impresión exitosa " + "de pedido " + mi_param + " con código: " + codigo);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", true);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return true;
            } catch (Exception e) {
                setearError(e);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", false);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return false;
            }
        } else {
            return false;
        }
    }

    public boolean guardar(String mi_param) {

        switch (this.accion) {
            case CREAR:
                return crear(mi_param);
            case EDITAR:
                return modificar(mi_param);
            default:
                return false;
        }
    }

    private boolean modificar(String mi_param) {
        if (consultarPermisos().isModificacion()) {
            try {
                String codigo = String.valueOf(this.temporal.getId());
                this.temporal.setDireccion(this.direccionAd);
                entidadFacade.editar(this.temporal);
                setearInfo("Modificación exitosa " + "de pedido " + mi_param + " con código: " + codigo);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", true);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return true;
            } catch (Exception e) {
                setearError(e);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", false);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return false;
            }
        } else {
            return false;
        }
    }

    private void horaValida() throws FechaInvalidaPedidoException_1 {
        System.out.println(this.fechaHoy);
        int minutos = this.fechaHoy.getMinutes() + 30;
        this.fechaHoy.setMinutes(minutos);
        this.getTemporal().setFechaHoraEnvio(this.fechaHoy);
        this.getTemporal().setFechaHora(this.getfHoy().getTime());
    }

    private void validarLista() throws ListaProductosPedidoVacia {
        if (this.getPedidoGenerico().getPedido() == null || this.getPedidoGenerico().getPedido().isEmpty()) {
            throw new ListaProductosPedidoVacia("Debe seleccionar al menos un producto para su menú");
        } else {
            List<ItemProducto> pedido = this.getPedidoGenerico().getPedido();
            int cantidad = 0;
            for (Iterator<ItemProducto> it = pedido.iterator(); it.hasNext();) {
                ItemProducto itemProducto = it.next();
                if (itemProducto != null) {
                    cantidad += itemProducto.getCantidad();
                }
            }
            if (cantidad == 0) {
                throw new ListaProductosPedidoVacia("Debe seleccionar al menos un producto para su menú");
            }
        }
    }

    private boolean crear(String mi_param) {
        if (consultarPermisos().isAlta()) {
            try {
                validarLista();
                horaValida();
                SimpleDateFormat formatearFecha = new SimpleDateFormat("dd-MM-yyyy HH:mm");
                String fecha = formatearFecha.format(this.temporal.getFechaHoraEnvio());
                if (!direccionAd.isEmpty()) {
                    this.temporal.setDireccion(direccionAd);
                } else {
                    this.temporal.setDireccion("Calle: " + this.temporal.getCliente().getCalle() + ", "
                            + "Núm. Puerta: " + this.temporal.getCliente().getNumero() + ", "
                            + "Detalles: " + this.temporal.getCliente().getDetalle());
                }
                this.setDemora("El pedido demorará aproximadamente unos 30 minutos");
                temporal.setListaItemsProductos(this.getPedidoGenerico().getPedido());
                entidadFacade.crear(this.temporal);
                setearInfo("Se ha creado exitosamente su pedido " + mi_param + ", la fecha y hora de envío es: "
                        + fecha + ", la demora aproximada es de 30 minutos");
                RequestContext.getCurrentInstance().addCallbackParam("correcto", true);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                this.getPedidoGenerico().setPedido(null);
                this.fechaHoy = new Date();
                return true;

            } catch (FechaInvalidaPedidoException_1 e) {
                setearError(e);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", false);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return false;
            } catch (Exception e) {
                setearError(e);
                RequestContext.getCurrentInstance().addCallbackParam("correcto", false);
                RequestContext.getCurrentInstance().addCallbackParam("param", mi_param);
                return false;
            }
        } else {
            return false;
        }
    }

    public enum Accion {

        CREAR, EDITAR, VER;
    }

    private String formatearPrecio(double precio) {
        DecimalFormat df = new DecimalFormat("###,###.##");
        return df.format(precio);
    }

    public String devuelvePrecioItem(ItemProducto itemProducto) {
        return formatearPrecio(calculaPrecioItem(itemProducto));
    }

    public String devuelveTotalAPagar() {
        return formatearPrecio(totalAPagar());
    }

    private double calculaPrecioItem(ItemProducto itemProducto) {
        double resp = 0;
        if (itemProducto != null && itemProducto.getProducto() != null) {
            resp = itemProducto.getCantidad() * itemProducto.getProducto().getPrecio();
        }
        return resp;
    }

    private double totalAPagar() {
        double resp = 0;
        if (this.getPedidoGenerico().getPedido() != null) {
            for (Iterator<ItemProducto> it = this.getPedidoGenerico().getPedido().iterator(); it.hasNext();) {
                ItemProducto item = it.next();
                if (item != null && item.getProducto() != null) {
                    resp += calculaPrecioItem(item);
                }
            }
        }
        return resp;
    }

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public Double getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(Double subTotal) {
        this.subTotal = subTotal;
    }

    public Double getPrecioIva() {
        return precioIva;
    }

    public void setPrecioIva(Double precioIva) {
        this.precioIva = precioIva;
    }

    public List<String> complete(String usuario) {
        List<String> results = new ArrayList<>();
        try {
            Cliente c = new Cliente();
            c.setNombreUsuario(usuario);
            List<Cliente> listaClientes = consultaUniversalFacade.consultar(new Consulta(c));
            for (int i = 0; i < listaClientes.size(); i++) {
                results.add(listaClientes.get(i).getNombreUsuario());
            }
        } catch (Exception ex) {
        }
        return results;
    }

    public void cargarDireccion() {
        try {
            Cliente c;
            Condicional cond = new Condicional("nombreUsuario", this.nombreUsuario, "=");
            List<Condicional> parametros = new ArrayList<>();
            parametros.add(cond);
            List<Cliente> lista = clienteFacade.buscarConParametros(parametros, null, new int[]{0, 1});
            if (lista != null && lista.size() > 0) {
                c = lista.get(0);
                if (!c.getDetalle().trim().equals("")) {
                    this.setDireccionAd(c.getCalle() + " " + c.getNumero() + ", " + c.getDetalle());
                } else {
                    this.setDireccionAd(c.getCalle() + " " + c.getNumero());
                }
                this.temporal.setCliente(c);
            } else {
                this.setDireccionAd("");
            }
        } catch (Exception e) {
        }

    }
}
